package www.com.library.util;

import java.math.BigDecimal;

/**
 * 行情价格格式化类
 * @author Administrator
 *
 */
public class ProductPrecision {
	public final String DefaultFormatString = "%1$.2";//默认格式化字符串格式

	public int mNumOfDigits;//整数数字位数
	public int mNumOfDecimalsPoint;//小数数字位数
	public double mAdjustValue; //需要调整的double数据
	public String mFormatString; //格式化字符串格式

	/**
	 * 构造器
	 */
	public ProductPrecision() {
		mFormatString = DefaultFormatString;
		config(mNumOfDigits, mNumOfDecimalsPoint);
	}

	/**
	 * 构造器
	 * @param numOfDecimalsPoint 小数数字位数
	 */
	public ProductPrecision(int numOfDecimalsPoint) {
		config(0, numOfDecimalsPoint);
	}

	/**
	 * 构造器
	 * @param numOfDigits 整数数字位数
	 * @param numOfDecimalsPoint 小数数字位数
	 */
	public ProductPrecision(int numOfDigits, int numOfDecimalsPoint) {
		config(numOfDigits, numOfDecimalsPoint);
	}

	/**
	 * 配置数字预留位数
	 * @param numOfDigits 整数数字位数
	 * @param numOfDecimalsPoint 小数数字位数
	 */
	public void config(int numOfDigits, int numOfDecimalsPoint) {
		mNumOfDigits = numOfDigits;
		mNumOfDecimalsPoint = numOfDecimalsPoint;
		if (numOfDecimalsPoint < 0)
			mAdjustValue = 0d;
		else
			mAdjustValue = Math.pow(10d, -(numOfDecimalsPoint + 2));

		if (numOfDigits == 0) {
			mFormatString = "%1$." + String.valueOf(mNumOfDecimalsPoint) + "f";
		} else {
			mFormatString = "%1$" + String.valueOf(mNumOfDigits) + "." + String.valueOf(mNumOfDecimalsPoint) + "f";
		}
	}

	/**
	 * 返回小数位数
	 * @return
	 */
	public int getDecimalsPoint() {
		return mNumOfDecimalsPoint;
	}

	/**
	 * 格式化数据
	 * @param data
	 * @return
	 */
	public String format(double data) {
		double newData=round(data,mNumOfDecimalsPoint);
		String tmpFormatString = mFormatString.endsWith("f") ? mFormatString : mFormatString + "f";
		if (DoubleConverter.isZero(newData))
			return String.format(tmpFormatString, 0d);

		final double absData = Math.abs(newData);
		final String formatStr = (newData < 0) ? "-" + tmpFormatString : tmpFormatString;
		return String.format(formatStr, absData);
	}


	/**
	 * 根据指定小数位数向上取值
	 * @param value
	 * @return
	 */
	public double round(double value) {
		String data = format(value);
		if (data == null)
			return 0d;
		return Double.parseDouble(data);
	}
	/**
	 * 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_UP
	 *
	 * @param v 需要四舍五入的数字
	 * @param scale 小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {
		return round(v, scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 提供精确的小数位四舍五入处理
	 *
	 * @param v 需要四舍五入的数字
	 * @param scale 小数点后保留几位
	 * @param round_mode 指定的舍入模式
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale, int round_mode) {

		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}

		BigDecimal b = new BigDecimal(Double.toString(v));

		return b.setScale(scale, round_mode).doubleValue();
	}
}